package org.osiris.server;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.osiris.client.model.CategoriaViewBean;
import org.osiris.client.model.ComplejidadrequisitoViewBean;
import org.osiris.client.model.EstadoProyectoViewBean;
import org.osiris.client.model.EstadorequisitoViewBean;
import org.osiris.client.model.IncertidumbreViewBean;
import org.osiris.client.model.PeticionCambioViewBean;
import org.osiris.client.model.PrioridadViewBean;
import org.osiris.client.model.ProyectoViewBean;
import org.osiris.client.model.RecursoViewBean;
import org.osiris.client.model.RequisitoViewBean;
import org.osiris.client.model.RiesgoViewBean;
import org.osiris.client.model.TipoRecursoViewBean;
import org.osiris.client.model.TipoRequisitoViewBean;
import org.osiris.client.model.UsuarioViewBean;
import org.osiris.client.services.BussinessInterfaceService;
import org.osiris.persistence.Proyecto;
import org.osiris.persistence.Requisito;
import org.osiris.persistence.Requisitosdeproyecto;
import org.osiris.persistence.Riesgo;
import org.osiris.persistence.controllers.RequisitoDeProyectoInterface;
import org.osiris.server.bussinesscore.ProyectosManager;
import org.osiris.server.bussinesscore.RequisitosManager;
import org.osiris.server.utils.AppContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;

/**
 * {@link AuthenticationService} implementation.
 * 
 * @author See Wah Cheng
 * @created 5 Jun 2009
 */
public class BussinessInterfaceServiceImpl implements BussinessInterfaceService {
	private ApplicationContext ctx = AppContext.getApplicationContext();
	SimpleDateFormat formato = new SimpleDateFormat("dd-MM-yyyy");

	@Autowired
	ProyectosManager proyectosManager;

	@Autowired
	RequisitosManager requisitosManager;
	@Resource
	private RequisitoDeProyectoInterface reqDeProDAO;
	Logger logger=Logger.getLogger(this.getClass());

	@Override
	public List<ProyectoViewBean> buscarProyectos(String cliente,
			String descripcion, String estado, Date fechaalta, Long idProyecto,
			String nombre, String referencia, String usuario) {
		List<ProyectoViewBean> result=new ArrayList<ProyectoViewBean>();
		logger.info("Buscando proyectos:");
		List<Proyecto> res = proyectosManager.buscarProyectos(cliente, 
				descripcion, estado, fechaalta, 
				idProyecto, nombre, referencia, 
				usuario);
		for(int x=0;x<res.size();x++){
			result.add(res.get(x).toView());
		}

		return result;
	}

	@Override
	public List<RequisitoViewBean> buscarRequisitos(String autor,
			String descripcion,
			String detallerequisito,
			Date fechaalta,
			Date fechabaja,
			ComplejidadrequisitoViewBean idComplejidadRequisito,
			EstadorequisitoViewBean idEstadoRequisito,
			Long idRequisito,
			CategoriaViewBean subcategoria,
			TipoRequisitoViewBean idTipoRequisito,
			String nombre,
			Integer puntosFuncion,
			String referencia,
			String responsable,
			String origen,
			ProyectoViewBean pr, 
			Long requisito_relacionado,
			boolean dependencia) {
		if(reqDeProDAO==null){
			reqDeProDAO=(RequisitoDeProyectoInterface) ctx.getBean("RequisitosdeproyectoJpaController");
		}
		List<RequisitoViewBean> result=new ArrayList<RequisitoViewBean>();

		Long est=null;
		if(idEstadoRequisito!=null){
			est=idEstadoRequisito.getid();
		}
		Long sub=null;
		if(subcategoria!=null){
			sub=subcategoria.getid();
		}
		Long tipo=null;
		if(idTipoRequisito!=null){
			tipo=idTipoRequisito.getid();
		}
		Long comple=null;
		if(idComplejidadRequisito!=null){
			comple=idComplejidadRequisito.getid();
		}
		Long project=null;
		if(pr!=null){
			project=pr.getidProyecto();
		}

		List<Requisito> res = requisitosManager.buscarRequisitos(
				autor,
				descripcion, 
				detallerequisito, 
				fechaalta, 
				fechabaja, 
				comple,
				est, 
				idRequisito, 
				sub, 
				tipo, 
				nombre, 
				puntosFuncion, 
				referencia, 
				responsable, 
				origen,
				project,
				requisito_relacionado,
				dependencia); 

		for(int x=0;x<res.size();x++){
			RequisitoViewBean dto = res.get(x).toView();
			if(project!=null && !dependencia){
				Requisitosdeproyecto relacion = this.reqDeProDAO.buscarPorRequisito(dto.getidRequisito(),project);
				IncertidumbreViewBean invibean=new IncertidumbreViewBean(relacion.getIdIncertidumbre().getIdIncertidumbre(),relacion.getIdIncertidumbre().getClave());
				dto.setincertidumbre(invibean);
				dto.setprioridad(new PrioridadViewBean(relacion.getIdPrioridadRequisito().getIdPrioridadRequisito(),relacion.getIdPrioridadRequisito().getValor()));
				dto.setsituacion(new EstadoProyectoViewBean(1L,relacion.getEstadoRequistoEnProyecto()));
			}
			result.add(dto);
		}

		return result;
	}

	@Override
	public ProyectoViewBean crearProyecto(String cliente, String descripcion,
			String estado, String nombre, String referencia,
			String usuario_resposanble,String usuario_alta,String resumen) {
		logger.info("Creando Proyecto para:"+nombre+" "+estado+" "+cliente+" descripcion "+ referencia+" "+usuario_resposanble+" "+usuario_alta);
		if(proyectosManager==null){
			proyectosManager=(ProyectosManager) ctx.getBean("ProyectosManager");
		}
		Proyecto be = proyectosManager.crearProyecto(cliente, descripcion, estado, nombre, referencia, usuario_resposanble, usuario_alta,resumen);
		logger.info("Proyecto creado");
		return be.toView();
	}

	@Override
	public RequisitoViewBean crearRequisito(
			String referencia,
			Long categoriaBiewBean,
			long estado,
			String puntosFuncion,
			Long usuarioAlta,
			Long responsable,
			Long tipo,
			long subcategoria,
			long complejidad,
			String nombre,
			String version,
			String origen,
			String detalle,
			Long proyecto,
			Long prioridad,
			Long incertidumbre,
			String situacion,String resumen) {
		Requisito req = requisitosManager.crearRequisito(referencia, categoriaBiewBean, estado, Integer.parseInt(puntosFuncion), 
				usuarioAlta, responsable, tipo, subcategoria, complejidad, nombre, 
				Integer.parseInt(version), origen, detalle, proyecto, 
				prioridad, incertidumbre, situacion,resumen);
		if(proyecto!=null){
			for(Proyecto practual: proyectosManager.getProyectosEnUso()){		 
				logger.info("anado al proyecto en memoria el nuevo requisito");
				if(practual.getIdProyecto().equals(proyecto)){
					practual.getRequisitosdeproyectoList().addAll(req.getRequisitosdeproyectoList());
				}
			} 
		}
		return req.toView();

	}


	/*RIESGOS*/
	public List <RiesgoViewBean> getRiesgosRequisito(Long requisito){
		List<Riesgo> list = this.requisitosManager.getRiesgosDeRequisito(requisito);
		List <RiesgoViewBean> resultado=new ArrayList<RiesgoViewBean>();
		for(int x=0;x<list.size();x++){
			resultado.add(list.get(x).toView());
		}
		return resultado;
	}
	public RiesgoViewBean asociarRiesgoARequisito(Long requisito,String descripcion,String nombre, Long usuario, String impacto, String probabilidad){
		return this.requisitosManager.asociarRiesgoARequisito(requisito, descripcion, nombre, usuario, impacto, probabilidad).toView();
	}
	public boolean desasociarRiesgoARequisito(Long requisito,Long riesgo){
		return this.requisitosManager.desasociarRiesgoARequisito(requisito, riesgo);
	}

	@Override
	public Boolean modificarProyecto(ProyectoViewBean proyecto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean altaPeticionCambio(UsuarioViewBean autor,
			ComplejidadrequisitoViewBean complejidad, String descripcion,
			Double esfuerzo, EstadorequisitoViewBean estado,
			List<RequisitoViewBean> impactos, Long idPeticion,
			IncertidumbreViewBean incertidumbre, String motivo, String origen,
			PrioridadViewBean prioridad, List<RecursoViewBean> recursos) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public RecursoViewBean altaRecurso(String nombre, String referenmcia,
			String filename, String descripcion, TipoRecursoViewBean subtipo) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean altaRecursoAPeticion(PeticionCambioViewBean p,
			RecursoViewBean r) {
		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public Boolean asignarRecursoARequisito(RequisitoViewBean p,
			RecursoViewBean r) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean asociarRequisitoAProyecto(ProyectoViewBean proy,
			RequisitoViewBean req, Long prioridad, Long incertidumbre,
			Long autor) {

		return this.proyectosManager.asociarRequisito(req.getidRequisito(), proy.getidProyecto(), prioridad, incertidumbre, autor);
	}



	@Override
	public Boolean bajaRecursoAPeticion(PeticionCambioViewBean p,
			RecursoViewBean r) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<PeticionCambioViewBean> buscarPeticionCambio(Long id,
			String texto, Long usuario, Long requisito, Long proyecto,
			Date desde, Date hasta, Long incertidumbre, Long prioridad,
			Long estado, Long complejidad) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<RecursoViewBean> buscarRecurso(Long id, Long idtipo,
			Long idsubtipo, String filename, String nombre, String referencia,
			String descripcion) {
		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public boolean crearDependenciaRequisito(RequisitoViewBean requisito,
			RequisitoViewBean nuevaDependencia) {
		// TODO Auto-generated method stub
		return this.requisitosManager.crearDependencia(requisito.getidRequisito(), nuevaDependencia.getidRequisito());
	}

	@Override
	public Boolean desasignarRecursoARequisito(RequisitoViewBean p,
			RecursoViewBean r) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean desasociarRequisitoAProyecto(ProyectoViewBean proy,
			RequisitoViewBean req) {
		this.proyectosManager.desasociarRequisito(req.getidRequisito(),proy.getidProyecto());
		return false;
	}



	@Override
	public boolean eliminarDependenciaRequisito(RequisitoViewBean requisito,
			RequisitoViewBean nuevaDependencia) {
		this.requisitosManager.eliminarDependencia(requisito.getidRequisito(), nuevaDependencia.getidRequisito());
		return true;
	}

	@Override
	public List<RequisitoViewBean> getDependenciasRequisito(
			RequisitoViewBean requisito) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<RequisitoViewBean> getRecursosRequisito(RequisitoViewBean req) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<RequisitoViewBean> getRequisitosProyecto(ProyectoViewBean proy) {
		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public List<RequisitoViewBean> getVersionesRequisito(RequisitoViewBean req) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean modificarPeticionCambio(PeticionCambioViewBean p) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Boolean modificarRecurso(RecursoViewBean r) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<CategoriaViewBean> getCategorias() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<ComplejidadrequisitoViewBean> getComplejidadRequisito() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<EstadorequisitoViewBean> getEstadosRequisito() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<IncertidumbreViewBean> getIncertidumbres() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<PrioridadViewBean> getPrioridades() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<ProyectoViewBean> getProyectos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<CategoriaViewBean> getSubCategorias(CategoriaViewBean cat) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<TipoRequisitoViewBean> getTipos() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<TipoRecursoViewBean> getTiposRecurso() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<UsuarioViewBean> getUsuarios() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<EstadoProyectoViewBean> getEstadoProyectoViewBean() {
		// TODO Auto-generated method stub
		return null;
	}



}
